/**
 * [src/main.rs:4:5] &args = [
    "target/debug/minigrep",
    "test1",
    "test2",
]
    std::env::args().collect()返回的第一个参数是程序本身的路径，所以args[1]才是我们需要的第一个参数
 */

use std::env;
use std::fs;
use std::process;
fn main() {
    // let args: Vec<String> = env::args().collect();
    // dbg!(&args);
    // let query = &args[1];
    // let filename = &args[2];
    let args: Vec<String> = env::args().collect();
    let config= Config::new(&args).unwrap_or_else(|err| {
        println!("Problem parsing arguments: {}", err);
        process::exit(1);
    });
    // 将以下内容封装到run函数中
    // let contents = fs::read_to_string(config::filename)
    // .expect("Something went wrong reading the file");
    // println!("With text:\n{}", contents);
    run(config).unwrap_or_else(|err| {
        println!("Application error: {}", err);
        process::exit(1);
    });
}

struct Config {
    query: String,
    filename: String,
}
impl Config {
    fn new(args: &[String]) -> Result<Config, &'static str>{
        if args.len() !=3 {
            return Err("not enough arguments");
        }
        let query = args[1].clone();
        let filename = args[2].clone();
        return Ok(Config { query, filename });
    }
}
use std::error::Error;
fn run(config: Config) -> Result<(), Box<dyn Error>> {
    let contents = fs::read_to_string(config.filename)?;
    println!("With text:\n{}", contents);
    // println!("下面使用for循环遍历文件的每一行，得到想要搜索的内容");
    // let mut result = Vec::new();
    // for line in contents.lines() {
    //     if line.contains(&config.query) {
    //         result.push(line);
    //     }
    // } //封装进search方法
    let result=search(&config.query, &contents);
    dbg!(&result);
    Ok(())
}
fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    println!("下面使用for循环遍历文件的每一行，得到想要搜索的内容");
    let mut result = Vec::new();
    for line in contents.lines() {
        if line.contains(query) {
            result.push(line);
        }
    }
    return result;
}
